Installation¶
At time of this tutorial, RAY support python <= 3.11, read more at Installation
In [ ]:
Copied!
!pip install "ray[tune,client]"
!pip install optuna
!pip install "ray[tune,client]"
!pip install optuna
Sample Strategy¶
In [1]:
Copied!
import talib.abstract as ta
from lettrade import DataFeed, Strategy, indicator as i
from lettrade.exchange.backtest import ForexBackTestAccount, let_backtest
# from lettrade.indicator.vendor.qtpylib import inject_indicators
# inject_indicators()
class SmaCross(Strategy):
ema1_period = 9
ema2_period = 21
def indicators(self, df: DataFeed):
df["ema1"] = ta.EMA(df, timeperiod=self.ema1_period)
df["ema2"] = ta.EMA(df, timeperiod=self.ema2_period)
# df["ema1"] = df.close.ema(window=self.ema1_period)
# df["ema2"] = df.close.ema(window=self.ema2_period)
df["signal_ema_crossover"] = i.crossover(df.ema1, df.ema2)
df["signal_ema_crossunder"] = i.crossunder(df.ema1, df.ema2)
def next(self, df: DataFeed):
if len(self.orders) > 0 or len(self.positions) > 0:
return
if df.l.signal_ema_crossover[-1]:
price = df.l.close[-1]
self.buy(size=0.1, sl=price - 0.001, tp=price + 0.001)
elif df.l.signal_ema_crossunder[-1]:
price = df.l.close[-1]
self.sell(size=0.1, sl=price + 0.001, tp=price - 0.001)
lt = let_backtest(
strategy=SmaCross,
datas="example/data/data/EURUSD_5m-0_10000.csv",
account=ForexBackTestAccount,
# plotter=None,
)
import talib.abstract as ta
from lettrade import DataFeed, Strategy, indicator as i
from lettrade.exchange.backtest import ForexBackTestAccount, let_backtest
# from lettrade.indicator.vendor.qtpylib import inject_indicators
# inject_indicators()
class SmaCross(Strategy):
ema1_period = 9
ema2_period = 21
def indicators(self, df: DataFeed):
df["ema1"] = ta.EMA(df, timeperiod=self.ema1_period)
df["ema2"] = ta.EMA(df, timeperiod=self.ema2_period)
# df["ema1"] = df.close.ema(window=self.ema1_period)
# df["ema2"] = df.close.ema(window=self.ema2_period)
df["signal_ema_crossover"] = i.crossover(df.ema1, df.ema2)
df["signal_ema_crossunder"] = i.crossunder(df.ema1, df.ema2)
def next(self, df: DataFeed):
if len(self.orders) > 0 or len(self.positions) > 0:
return
if df.l.signal_ema_crossover[-1]:
price = df.l.close[-1]
self.buy(size=0.1, sl=price - 0.001, tp=price + 0.001)
elif df.l.signal_ema_crossunder[-1]:
price = df.l.close[-1]
self.sell(size=0.1, sl=price + 0.001, tp=price - 0.001)
lt = let_backtest(
strategy=SmaCross,
datas="example/data/data/EURUSD_5m-0_10000.csv",
account=ForexBackTestAccount,
# plotter=None,
)
Optimize¶
In [2]:
Copied!
from ray import tune, train
from ray.tune.search.optuna import OptunaSearch
from lettrade.exchange.backtest.extra.ray import LetOptimizeRay
import logging
logging.getLogger("ray.tune.tune").setLevel(logging.WARNING)
letray = LetOptimizeRay()
lettrade_model = lt.optimize_model(dumper=letray.dumps)
def train_model(config, data):
params = {
"ema1_period": config["ema1_period"],
"ema2_period": config["ema2_period"],
}
# Model
result = lettrade_model(params, optimizer_kwargs=data)
# Score
return {"score": result["equity"]}
search_space = {
"ema1_period": tune.qrandint(5, 25, q=1),
"ema2_period": tune.qrandint(10, 50, q=1),
}
algo = OptunaSearch()
# algo = tune.search.ConcurrencyLimiter(algo, max_concurrent=4)
tuner = tune.Tuner(
tune.with_parameters(train_model, data=letray.data),
tune_config=tune.TuneConfig(
metric="score",
mode="max",
search_alg=algo,
num_samples=100,
),
# run_config=train.RunConfig(verbose=0),
param_space=search_space,
)
results = tuner.fit()
lt.optimize_done()
from ray import tune, train
from ray.tune.search.optuna import OptunaSearch
from lettrade.exchange.backtest.extra.ray import LetOptimizeRay
import logging
logging.getLogger("ray.tune.tune").setLevel(logging.WARNING)
letray = LetOptimizeRay()
lettrade_model = lt.optimize_model(dumper=letray.dumps)
def train_model(config, data):
params = {
"ema1_period": config["ema1_period"],
"ema2_period": config["ema2_period"],
}
# Model
result = lettrade_model(params, optimizer_kwargs=data)
# Score
return {"score": result["equity"]}
search_space = {
"ema1_period": tune.qrandint(5, 25, q=1),
"ema2_period": tune.qrandint(10, 50, q=1),
}
algo = OptunaSearch()
# algo = tune.search.ConcurrencyLimiter(algo, max_concurrent=4)
tuner = tune.Tuner(
tune.with_parameters(train_model, data=letray.data),
tune_config=tune.TuneConfig(
metric="score",
mode="max",
search_alg=algo,
num_samples=100,
),
# run_config=train.RunConfig(verbose=0),
param_space=search_space,
)
results = tuner.fit()
lt.optimize_done()
Tune Status
| Current time: | 2024-06-15 09:31:24 |
| Running for: | 00:01:31.89 |
| Memory: | 9.4/62.7 GiB |
System Info
Using FIFO scheduling algorithm.Logical resource usage: 1.0/32 CPUs, 0/1 GPUs (0.0/1.0 accelerator_type:G)
Trial Status
| Trial name | status | loc | ema1_period | ema2_period | iter | total time (s) | score |
|---|---|---|---|---|---|---|---|
| train_model_567e8489 | TERMINATED | 192.168.1.84:15993 | 17 | 14 | 1 | 0.394129 | 1056.08 |
| train_model_0b9c709f | TERMINATED | 192.168.1.84:16129 | 7 | 46 | 1 | 0.219453 | 920.68 |
| train_model_15f951e4 | TERMINATED | 192.168.1.84:16203 | 18 | 14 | 1 | 0.187165 | 1116.68 |
| train_model_1054961c | TERMINATED | 192.168.1.84:16275 | 9 | 24 | 1 | 0.197212 | 893.48 |
| train_model_aceac61d | TERMINATED | 192.168.1.84:16341 | 24 | 38 | 1 | 0.205062 | 931.48 |
| train_model_ce105e0c | TERMINATED | 192.168.1.84:16413 | 23 | 17 | 1 | 0.183184 | 1020.28 |
| train_model_a5ec8f89 | TERMINATED | 192.168.1.84:16511 | 20 | 41 | 1 | 0.206701 | 962.68 |
| train_model_e1ead9ce | TERMINATED | 192.168.1.84:16577 | 6 | 35 | 1 | 0.189952 | 960.68 |
| train_model_9b0198ca | TERMINATED | 192.168.1.84:16644 | 22 | 49 | 1 | 0.196741 | 1006.88 |
| train_model_b22a89bc | TERMINATED | 192.168.1.84:16711 | 5 | 24 | 1 | 0.19996 | 852.58 |
| train_model_b0438800 | TERMINATED | 192.168.1.84:16782 | 8 | 21 | 1 | 0.196432 | 962.68 |
| train_model_aa0e7c19 | TERMINATED | 192.168.1.84:16850 | 13 | 12 | 1 | 0.190239 | 1150.28 |
| train_model_5efdbdc2 | TERMINATED | 192.168.1.84:16928 | 16 | 10 | 1 | 0.20991 | 1140.58 |
| train_model_15871df1 | TERMINATED | 192.168.1.84:16996 | 12 | 11 | 1 | 0.201834 | 1153.88 |
| train_model_3b28c8c8 | TERMINATED | 192.168.1.84:17063 | 13 | 10 | 1 | 0.200765 | 1153.78 |
| train_model_9925dbec | TERMINATED | 192.168.1.84:17129 | 13 | 29 | 1 | 0.189993 | 1029.18 |
| train_model_b2764cd3 | TERMINATED | 192.168.1.84:17195 | 12 | 29 | 1 | 0.20041 | 979.58 |
| train_model_15993c9d | TERMINATED | 192.168.1.84:17261 | 11 | 19 | 1 | 0.225685 | 1012.48 |
| train_model_ce4d58de | TERMINATED | 192.168.1.84:17327 | 10 | 18 | 1 | 0.205284 | 950.48 |
| train_model_2c7e1a4e | TERMINATED | 192.168.1.84:17395 | 10 | 10 | 1 | 0.208917 | 1000 |
| train_model_ba0b19e2 | TERMINATED | 192.168.1.84:17461 | 14 | 10 | 1 | 0.21732 | 1183.88 |
| train_model_d04dbfda | TERMINATED | 192.168.1.84:17547 | 14 | 25 | 1 | 0.254303 | 900.18 |
| train_model_591bbf70 | TERMINATED | 192.168.1.84:17632 | 14 | 15 | 1 | 0.288824 | 992.68 |
| train_model_c6e477f3 | TERMINATED | 192.168.1.84:17711 | 15 | 13 | 1 | 0.24678 | 1009.38 |
| train_model_96bd7001 | TERMINATED | 192.168.1.84:17792 | 15 | 10 | 1 | 0.221637 | 1120.48 |
| train_model_4d4d03cd | TERMINATED | 192.168.1.84:17876 | 19 | 21 | 1 | 0.247008 | 969.68 |
| train_model_72dbb93d | TERMINATED | 192.168.1.84:17953 | 12 | 17 | 1 | 0.184375 | 992.78 |
| train_model_ef05b46b | TERMINATED | 192.168.1.84:18020 | 12 | 16 | 1 | 0.206489 | 980.68 |
| train_model_49e81eb3 | TERMINATED | 192.168.1.84:18086 | 17 | 15 | 1 | 0.182067 | 1118.58 |
| train_model_16349ae4 | TERMINATED | 192.168.1.84:18153 | 17 | 12 | 1 | 0.200432 | 1006.98 |
| train_model_43578958 | TERMINATED | 192.168.1.84:18226 | 17 | 13 | 1 | 0.180715 | 1028.38 |
| train_model_a74e8eb3 | TERMINATED | 192.168.1.84:18292 | 9 | 33 | 1 | 0.176146 | 899.68 |
| train_model_03e41eec | TERMINATED | 192.168.1.84:18358 | 13 | 10 | 1 | 0.172216 | 1153.78 |
| train_model_fa885682 | TERMINATED | 192.168.1.84:18431 | 13 | 12 | 1 | 0.18103 | 1150.28 |
| train_model_80f1f623 | TERMINATED | 192.168.1.84:18497 | 14 | 10 | 1 | 0.170597 | 1183.88 |
| train_model_8e51adfb | TERMINATED | 192.168.1.84:18564 | 11 | 10 | 1 | 0.191377 | 1177.58 |
| train_model_30471d3f | TERMINATED | 192.168.1.84:18657 | 15 | 20 | 1 | 0.185873 | 851.58 |
| train_model_fd89af7d | TERMINATED | 192.168.1.84:18723 | 11 | 20 | 1 | 0.1741 | 1031.88 |
| train_model_912afd24 | TERMINATED | 192.168.1.84:18789 | 8 | 14 | 1 | 0.179255 | 810.48 |
| train_model_60db4bd0 | TERMINATED | 192.168.1.84:18855 | 9 | 14 | 1 | 0.19334 | 856.08 |
| train_model_81f9d953 | TERMINATED | 192.168.1.84:18921 | 19 | 41 | 1 | 0.180821 | 946.88 |
| train_model_37878487 | TERMINATED | 192.168.1.84:18987 | 20 | 26 | 1 | 0.20723 | 941.18 |
| train_model_e7b0b313 | TERMINATED | 192.168.1.84:19055 | 11 | 10 | 1 | 0.203764 | 1177.58 |
| train_model_8298fcd9 | TERMINATED | 192.168.1.84:19121 | 11 | 11 | 1 | 0.192459 | 1000 |
| train_model_a61dbe0a | TERMINATED | 192.168.1.84:19193 | 11 | 12 | 1 | 0.239823 | 826.08 |
| train_model_dbf37334 | TERMINATED | 192.168.1.84:19259 | 7 | 17 | 1 | 0.204537 | 846.08 |
| train_model_bae0e248 | TERMINATED | 192.168.1.84:19325 | 7 | 16 | 1 | 0.184754 | 850.98 |
| train_model_b6d4bc96 | TERMINATED | 192.168.1.84:19391 | 14 | 15 | 1 | 0.170364 | 992.68 |
| train_model_0be6d479 | TERMINATED | 192.168.1.84:19457 | 14 | 50 | 1 | 0.168588 | 951.68 |
| train_model_8ba14f88 | TERMINATED | 192.168.1.84:19523 | 16 | 13 | 1 | 0.187383 | 1007.38 |
| train_model_4a7aa781 | TERMINATED | 192.168.1.84:19590 | 25 | 23 | 1 | 0.198682 | 1049.28 |
| train_model_9d13b950 | TERMINATED | 192.168.1.84:19656 | 10 | 47 | 1 | 0.191259 | 912.48 |
| train_model_05946552 | TERMINATED | 192.168.1.84:19722 | 10 | 10 | 1 | 0.183701 | 1000 |
| train_model_bdc8be88 | TERMINATED | 192.168.1.84:19788 | 12 | 10 | 1 | 0.167025 | 1139.08 |
| train_model_cd9ef040 | TERMINATED | 192.168.1.84:19854 | 12 | 11 | 1 | 0.171795 | 1153.88 |
| train_model_0832acef | TERMINATED | 192.168.1.84:19921 | 13 | 12 | 1 | 0.182617 | 1150.28 |
| train_model_bcea84ba | TERMINATED | 192.168.1.84:19990 | 13 | 12 | 1 | 0.176934 | 1150.28 |
| train_model_8478f2b2 | TERMINATED | 192.168.1.84:20056 | 16 | 14 | 1 | 0.219377 | 1018.18 |
| train_model_ffaab6d9 | TERMINATED | 192.168.1.84:20125 | 16 | 14 | 1 | 0.182941 | 1018.18 |
| train_model_641cc62c | TERMINATED | 192.168.1.84:20207 | 9 | 11 | 1 | 0.202532 | 901.88 |
| train_model_3bd484ee | TERMINATED | 192.168.1.84:20279 | 11 | 18 | 1 | 0.207438 | 992.38 |
| train_model_77212f0f | TERMINATED | 192.168.1.84:20346 | 12 | 18 | 1 | 0.197155 | 991.98 |
| train_model_20deba80 | TERMINATED | 192.168.1.84:20414 | 12 | 11 | 1 | 0.197736 | 1153.88 |
| train_model_263b7f9e | TERMINATED | 192.168.1.84:20488 | 14 | 10 | 1 | 0.202125 | 1183.88 |
| train_model_52395f8e | TERMINATED | 192.168.1.84:20557 | 14 | 11 | 1 | 0.202452 | 1170.48 |
| train_model_ed3c0fdd | TERMINATED | 192.168.1.84:20627 | 14 | 13 | 1 | 0.194707 | 1059.38 |
| train_model_482e6539 | TERMINATED | 192.168.1.84:20693 | 14 | 13 | 1 | 0.191817 | 1059.38 |
| train_model_99a3604a | TERMINATED | 192.168.1.84:20766 | 15 | 16 | 1 | 0.188537 | 944.08 |
| train_model_9962248d | TERMINATED | 192.168.1.84:20832 | 15 | 16 | 1 | 0.201938 | 944.08 |
| train_model_39a0dea5 | TERMINATED | 192.168.1.84:20904 | 10 | 10 | 1 | 0.223073 | 1000 |
| train_model_13d09268 | TERMINATED | 192.168.1.84:20972 | 13 | 35 | 1 | 0.200546 | 1001.28 |
| train_model_c9fc7cd6 | TERMINATED | 192.168.1.84:21040 | 13 | 42 | 1 | 0.197765 | 913.68 |
| train_model_ebaa73f9 | TERMINATED | 192.168.1.84:21106 | 12 | 11 | 1 | 0.216298 | 1153.88 |
| train_model_c89fd048 | TERMINATED | 192.168.1.84:21175 | 11 | 11 | 1 | 0.205003 | 1000 |
| train_model_210abe74 | TERMINATED | 192.168.1.84:21258 | 11 | 11 | 1 | 0.194978 | 1000 |
| train_model_19a22c6e | TERMINATED | 192.168.1.84:21328 | 14 | 12 | 1 | 0.192942 | 1060.38 |
| train_model_3ecca919 | TERMINATED | 192.168.1.84:21394 | 14 | 13 | 1 | 0.206201 | 1059.38 |
| train_model_8e85dfc0 | TERMINATED | 192.168.1.84:21494 | 15 | 15 | 1 | 0.219632 | 1000 |
| train_model_5601e16a | TERMINATED | 192.168.1.84:21561 | 12 | 15 | 1 | 0.183326 | 960.38 |
| train_model_4b260a19 | TERMINATED | 192.168.1.84:21631 | 12 | 10 | 1 | 0.186971 | 1139.08 |
| train_model_258cb360 | TERMINATED | 192.168.1.84:21697 | 16 | 10 | 1 | 0.197186 | 1140.58 |
| train_model_6c38c970 | TERMINATED | 192.168.1.84:21764 | 13 | 10 | 1 | 0.188838 | 1153.78 |
| train_model_fccdeabd | TERMINATED | 192.168.1.84:21830 | 12 | 11 | 1 | 0.180142 | 1153.88 |
| train_model_3bb0fd66 | TERMINATED | 192.168.1.84:21896 | 12 | 12 | 1 | 0.218196 | 1000 |
| train_model_7789984e | TERMINATED | 192.168.1.84:21962 | 10 | 13 | 1 | 0.182172 | 826.18 |
| train_model_9970c744 | TERMINATED | 192.168.1.84:22029 | 10 | 13 | 1 | 0.204211 | 826.18 |
| train_model_a3055312 | TERMINATED | 192.168.1.84:22095 | 9 | 11 | 1 | 0.200074 | 901.88 |
| train_model_abab1cb7 | TERMINATED | 192.168.1.84:22167 | 22 | 14 | 1 | 0.205525 | 1158.88 |
| train_model_369f6fab | TERMINATED | 192.168.1.84:22270 | 13 | 28 | 1 | 0.190361 | 1000.18 |
| train_model_d7d815b3 | TERMINATED | 192.168.1.84:22336 | 18 | 14 | 1 | 0.194311 | 1116.68 |
| train_model_9940ae96 | TERMINATED | 192.168.1.84:22403 | 22 | 32 | 1 | 0.194089 | 923.28 |
| train_model_b6a41835 | TERMINATED | 192.168.1.84:22469 | 22 | 12 | 1 | 0.183299 | 1168.28 |
| train_model_38cbd8db | TERMINATED | 192.168.1.84:22535 | 15 | 12 | 1 | 0.190919 | 1039.58 |
| train_model_9e2cb1ef | TERMINATED | 192.168.1.84:22601 | 22 | 12 | 1 | 0.209193 | 1168.28 |
| train_model_381afd88 | TERMINATED | 192.168.1.84:22667 | 23 | 11 | 1 | 0.20926 | 1128.28 |
| train_model_b587a096 | TERMINATED | 192.168.1.84:22733 | 23 | 14 | 1 | 0.183836 | 1100.68 |
| train_model_0db4c953 | TERMINATED | 192.168.1.84:22801 | 21 | 14 | 1 | 0.196457 | 1148.58 |
| train_model_a6b16ae2 | TERMINATED | 192.168.1.84:22867 | 21 | 10 | 1 | 0.203772 | 1007.98 |
| train_model_ce670b25 | TERMINATED | 192.168.1.84:22935 | 22 | 12 | 1 | 0.21155 | 1168.28 |
| train_model_b9da7392 | TERMINATED | 192.168.1.84:23002 | 24 | 12 | 1 | 0.197647 | 1168.98 |
Plot¶
In [3]:
Copied!
lt.plotter.heatmap(x="ema1_period", y="ema2_period", z="equity")
lt.plotter.heatmap(x="ema1_period", y="ema2_period", z="equity")
In [4]:
Copied!
lt.plotter.contour(x="ema1_period", y="ema2_period", z="equity")
lt.plotter.contour(x="ema1_period", y="ema2_period", z="equity")
Init Plotly environment¶
In [5]:
Copied!
import plotly.io as pio
pio.renderers.default = "notebook"
pio.templates.default = "plotly_dark"
import plotly.io as pio
pio.renderers.default = "notebook"
pio.templates.default = "plotly_dark"
In [6]:
Copied!
df = results.get_dataframe()
df
df = results.get_dataframe()
df
Out[6]:
| score | timestamp | checkpoint_dir_name | done | training_iteration | trial_id | date | time_this_iter_s | time_total_s | pid | hostname | node_ip | time_since_restore | iterations_since_restore | config/ema1_period | config/ema2_period | logdir | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1056.08 | 1718418594 | None | False | 1 | 567e8489 | 2024-06-15_09-29-54 | 0.394129 | 0.394129 | 15993 | pc | 192.168.1.84 | 0.394129 | 1 | 17 | 14 | 567e8489 |
| 1 | 920.68 | 1718418594 | None | False | 1 | 0b9c709f | 2024-06-15_09-29-54 | 0.219453 | 0.219453 | 16129 | pc | 192.168.1.84 | 0.219453 | 1 | 7 | 46 | 0b9c709f |
| 2 | 1116.68 | 1718418595 | None | False | 1 | 15f951e4 | 2024-06-15_09-29-55 | 0.187165 | 0.187165 | 16203 | pc | 192.168.1.84 | 0.187165 | 1 | 18 | 14 | 15f951e4 |
| 3 | 893.48 | 1718418596 | None | False | 1 | 1054961c | 2024-06-15_09-29-56 | 0.197212 | 0.197212 | 16275 | pc | 192.168.1.84 | 0.197212 | 1 | 9 | 24 | 1054961c |
| 4 | 931.48 | 1718418597 | None | False | 1 | aceac61d | 2024-06-15_09-29-57 | 0.205062 | 0.205062 | 16341 | pc | 192.168.1.84 | 0.205062 | 1 | 24 | 38 | aceac61d |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 95 | 1100.68 | 1718418680 | None | False | 1 | b587a096 | 2024-06-15_09-31-20 | 0.183836 | 0.183836 | 22733 | pc | 192.168.1.84 | 0.183836 | 1 | 23 | 14 | b587a096 |
| 96 | 1148.58 | 1718418681 | None | False | 1 | 0db4c953 | 2024-06-15_09-31-21 | 0.196457 | 0.196457 | 22801 | pc | 192.168.1.84 | 0.196457 | 1 | 21 | 14 | 0db4c953 |
| 97 | 1007.98 | 1718418682 | None | False | 1 | a6b16ae2 | 2024-06-15_09-31-22 | 0.203772 | 0.203772 | 22867 | pc | 192.168.1.84 | 0.203772 | 1 | 21 | 10 | a6b16ae2 |
| 98 | 1168.28 | 1718418683 | None | False | 1 | ce670b25 | 2024-06-15_09-31-23 | 0.211550 | 0.211550 | 22935 | pc | 192.168.1.84 | 0.211550 | 1 | 22 | 12 | ce670b25 |
| 99 | 1168.98 | 1718418684 | None | False | 1 | b9da7392 | 2024-06-15_09-31-24 | 0.197647 | 0.197647 | 23002 | pc | 192.168.1.84 | 0.197647 | 1 | 24 | 12 | b9da7392 |
100 rows × 17 columns
In [7]:
Copied!
import pandas as pd
df.rename(
columns={
"config/ema1_period": "ema1_period",
"config/ema2_period": "ema2_period",
},
inplace=True,
)
df
import pandas as pd
df.rename(
columns={
"config/ema1_period": "ema1_period",
"config/ema2_period": "ema2_period",
},
inplace=True,
)
df
Out[7]:
| score | timestamp | checkpoint_dir_name | done | training_iteration | trial_id | date | time_this_iter_s | time_total_s | pid | hostname | node_ip | time_since_restore | iterations_since_restore | ema1_period | ema2_period | logdir | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1056.08 | 1718418594 | None | False | 1 | 567e8489 | 2024-06-15_09-29-54 | 0.394129 | 0.394129 | 15993 | pc | 192.168.1.84 | 0.394129 | 1 | 17 | 14 | 567e8489 |
| 1 | 920.68 | 1718418594 | None | False | 1 | 0b9c709f | 2024-06-15_09-29-54 | 0.219453 | 0.219453 | 16129 | pc | 192.168.1.84 | 0.219453 | 1 | 7 | 46 | 0b9c709f |
| 2 | 1116.68 | 1718418595 | None | False | 1 | 15f951e4 | 2024-06-15_09-29-55 | 0.187165 | 0.187165 | 16203 | pc | 192.168.1.84 | 0.187165 | 1 | 18 | 14 | 15f951e4 |
| 3 | 893.48 | 1718418596 | None | False | 1 | 1054961c | 2024-06-15_09-29-56 | 0.197212 | 0.197212 | 16275 | pc | 192.168.1.84 | 0.197212 | 1 | 9 | 24 | 1054961c |
| 4 | 931.48 | 1718418597 | None | False | 1 | aceac61d | 2024-06-15_09-29-57 | 0.205062 | 0.205062 | 16341 | pc | 192.168.1.84 | 0.205062 | 1 | 24 | 38 | aceac61d |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 95 | 1100.68 | 1718418680 | None | False | 1 | b587a096 | 2024-06-15_09-31-20 | 0.183836 | 0.183836 | 22733 | pc | 192.168.1.84 | 0.183836 | 1 | 23 | 14 | b587a096 |
| 96 | 1148.58 | 1718418681 | None | False | 1 | 0db4c953 | 2024-06-15_09-31-21 | 0.196457 | 0.196457 | 22801 | pc | 192.168.1.84 | 0.196457 | 1 | 21 | 14 | 0db4c953 |
| 97 | 1007.98 | 1718418682 | None | False | 1 | a6b16ae2 | 2024-06-15_09-31-22 | 0.203772 | 0.203772 | 22867 | pc | 192.168.1.84 | 0.203772 | 1 | 21 | 10 | a6b16ae2 |
| 98 | 1168.28 | 1718418683 | None | False | 1 | ce670b25 | 2024-06-15_09-31-23 | 0.211550 | 0.211550 | 22935 | pc | 192.168.1.84 | 0.211550 | 1 | 22 | 12 | ce670b25 |
| 99 | 1168.98 | 1718418684 | None | False | 1 | b9da7392 | 2024-06-15_09-31-24 | 0.197647 | 0.197647 | 23002 | pc | 192.168.1.84 | 0.197647 | 1 | 24 | 12 | b9da7392 |
100 rows × 17 columns
Type 1¶
In [8]:
Copied!
from plotly import express as px
fig = px.scatter(df, x=df.index, y="score")
fig.show()
from plotly import express as px
fig = px.scatter(df, x=df.index, y="score")
fig.show()
Type 2¶
In [9]:
Copied!
import plotly.express as px
fig = px.density_contour(
df,
x="ema1_period",
y="ema2_period",
z="score",
histfunc="max",
)
fig.update_traces(contours_coloring="fill", contours_showlabels=True)
fig.show()
import plotly.express as px
fig = px.density_contour(
df,
x="ema1_period",
y="ema2_period",
z="score",
histfunc="max",
)
fig.update_traces(contours_coloring="fill", contours_showlabels=True)
fig.show()
Type 3¶
In [10]:
Copied!
import plotly.express as px
fig = px.density_heatmap(
df,
x="ema1_period",
y="ema2_period",
z="score",
nbinsx=20,
nbinsy=40,
histfunc="max",
color_continuous_scale="Viridis",
)
fig.show()
import plotly.express as px
fig = px.density_heatmap(
df,
x="ema1_period",
y="ema2_period",
z="score",
nbinsx=20,
nbinsy=40,
histfunc="max",
color_continuous_scale="Viridis",
)
fig.show()